/**
 * 环信IM SDK配置类
 * 文件功能：配置环信IM SDK的连接参数和初始化
 * 方法数量：2个
 * 1. initEasemobClient() - 初始化环信IM客户端
 * 2. createApiClient() - 创建API客户端实例
 * 
 * 作者：元歌 309647724@qq.com
 */
package com.matrix.demohx.config;

import com.easemob.im.ApiClient;
import com.easemob.im.ApiException;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 环信IM配置类
 * 负责初始化环信IM SDK的连接配置
 */
@Configuration(proxyBeanMethods = false)
public class EasemobConfig {

    // 环信应用的AppKey，格式为：orgName#appName
    @Value("${easemob.appkey}")
    private String appkey;

    // 环信应用的ClientID
    @Value("${easemob.client-id}")
    private String clientId;

    // 环信应用的ClientSecret
    @Value("${easemob.client-secret}")
    private String clientSecret;

    // 环信REST API的基础路径
    @Value("${easemob.base-path}")
    private String basePath;

    /**
     * 初始化环信IM客户端
     * Spring容器启动后执行此方法，配置全局的API客户端
     */
    @PostConstruct
    public void initEasemobClient() {
        try {
            System.out.println("开始初始化环信IM SDK...");
            System.out.println("AppKey: " + appkey);
            System.out.println("ClientId: " + clientId);
            System.out.println("BasePath: " + basePath);
            
            // 根据环信Java Server SDK 2.0官方文档的标准配置方式
            // 必须设置basePath，使用您提供的环信REST API主机
            ApiClient apiClient = ApiClient.builder()
                    .setBasePath(basePath)          // REST API基础路径（必需）
                    .setAppKey(appkey)              // 应用AppKey
                    .setClientId(clientId)          // ClientID  
                    .setClientSecret(clientSecret)  // ClientSecret
                    .build();
            
            // 设置为默认的API客户端，供全局使用
            com.easemob.im.Configuration.setDefaultApiClient(apiClient);
            
            System.out.println("环信IM SDK初始化成功！");
        } catch (ApiException e) {
            // 如果初始化失败，记录详细错误信息
            System.err.println("环信IM SDK初始化失败: " + e.getMessage());
            System.err.println("错误响应码: " + e.getCode());
            System.err.println("错误响应体: " + e.getResponseBody());
            e.printStackTrace();
            throw new RuntimeException("环信IM SDK初始化失败", e);
        } catch (Exception e) {
            System.err.println("环信IM SDK初始化发生未知错误: " + e.getMessage());
            e.printStackTrace();
            throw new RuntimeException("环信IM SDK初始化失败", e);
        }
    }

    /**
     * 创建API客户端实例Bean
     * 提供ApiClient的Spring Bean，供其他组件注入使用
     * 
     * @return ApiClient 配置好的API客户端实例
     * @throws ApiException 当API客户端创建失败时抛出
     */
    @Bean
    public ApiClient apiClient() throws ApiException {
        // 创建API客户端，必须设置basePath
        return ApiClient.builder()
                .setBasePath(basePath)          // REST API基础路径（必需）
                .setAppKey(appkey)              // 设置应用AppKey
                .setClientId(clientId)          // 设置ClientID
                .setClientSecret(clientSecret)  // 设置ClientSecret
                .build();                       // 构建并返回API客户端
    }
}
